package com.github.xiaoymin.map.request.tencent;

import cn.hutool.core.collection.CollectionUtil;
import com.github.xiaoymin.map.common.MapClientConstants;
import com.github.xiaoymin.map.common.em.TencentCoordEnums;
import com.github.xiaoymin.map.exception.MapClientException;
import com.github.xiaoymin.map.model.MapLocation;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.stream.Collectors;

/**
 * 坐标转换
 * https://lbs.qq.com/service/webService/webServiceGuide/webServiceTranslate
 */
public class TencentCoordTranslateRequest {

    /**
     * 预转换的坐标，支持批量转换，
     * 格式：纬度前，经度后，纬度和经度之间用",“分隔，每组坐标之间使用”;"分隔；
     * 批量支持坐标个数以HTTP GET方法请求上限为准
     * eg:  locations=39.12,116.83;30.21,115.43
     */
    private List<MapLocation> mapLocations=new ArrayList<>();

    /**
     * 输入的locations的坐标类型
     * 可选值为[1,6]之间的整数，每个数字代表的类型说明：
     * 1 GPS坐标
     * 2 sogou经纬度
     * 3 baidu经纬度
     * 4 mapbar经纬度
     * 5 [默认]腾讯、google、高德坐标
     * 6 sogou墨卡托
     * eg: type=3
     */
    private Integer type=TencentCoordEnums.getNum("DEFAULT");

    public List<MapLocation> getMapLocations() {
        return mapLocations;
    }

    public void setMapLocations(List<MapLocation> mapLocations) {
        this.mapLocations = mapLocations;
    }

    public Integer getType() {
        return type;
    }

    public void setType(Integer type) {
        this.type = type;
    }

    public TencentCoordTranslateRequest(List<MapLocation> mapLocations, Integer type) {
        this.mapLocations = mapLocations;
        this.type = type;
    }

    /**
     * 获取当前对象的map参数
     * @return 参数map
     */
    public Map<String,String> toMap(){
        Map<String,String> parameterMap=new HashMap<>();
        String locations= CollectionUtil.join(mapLocations.stream().map(mapLocation -> mapLocation.getLat()+","+mapLocation.getLng()).collect(Collectors.toList()), MapClientConstants.BAIDU_JOIN_ELEMENT_CHAR);
        parameterMap.put("locations",locations);
        parameterMap.put("type",type.toString());
        return parameterMap;
    }

    public static class Builder{
        /**
         * 预转换的坐标，支持批量转换，
         * 格式：纬度前，经度后，纬度和经度之间用",“分隔，每组坐标之间使用”;"分隔；
         * 批量支持坐标个数以HTTP GET方法请求上限为准
         * eg:  locations=39.12,116.83;30.21,115.43
         */
        private List<MapLocation> mapLocations=new ArrayList<>();

        /**
         * 输入的locations的坐标类型
         * 可选值为[1,6]之间的整数，每个数字代表的类型说明：
         * 1 GPS坐标
         * 2 sogou经纬度
         * 3 baidu经纬度
         * 4 mapbar经纬度
         * 5 [默认]腾讯、google、高德坐标
         * 6 sogou墨卡托
         * eg: type=3
         */
        private Integer type= TencentCoordEnums.getNum("DEFAULT");

        /**
         * 添加地理位置
         * @param mapLocation 经纬度坐标对象
         * @return 当前Builder对象
         */
        public TencentCoordTranslateRequest.Builder addLocation(MapLocation mapLocation){
            mapLocations.add(mapLocation);
            return this;
        }

        /**
         * 转换坐标系类型
         * @param type 坐标系类型
         * @return 当前Builder对象
         */
        public TencentCoordTranslateRequest.Builder coordType(Integer type){
            this.type=type;
            return this;
        }

        /**
         * 添加地理位置
         * @param lng 经度
         * @param lat 纬度
         * @return 当前Builder对象
         */
        public TencentCoordTranslateRequest.Builder addLocation(String lng, String lat){
            mapLocations.add(new MapLocation(lng,lat));
            return this;
        }

        /**
         * 构造逆址编码请求对象
         * @return 逆址编码请求对象
         */
        public TencentCoordTranslateRequest build(){
            if (CollectionUtil.isEmpty(mapLocations)){
                throw new MapClientException("转换坐标不能为空");
            }
            return new TencentCoordTranslateRequest(mapLocations,type);
        }
    }
}
